package 题目集.线段树or树状数组.树状数组;

import java.util.Arrays;
import java.util.Scanner;

/**
 * https://www.acwing.com/problem/content/description/243/
 * 问题可以简化为：寻找每个数左侧比它大（小）的数，以及右侧比它大（小）的数。最后该数的贡献是 l[i]*r[i]
 */
public class demo04_楼兰图腾 {
	static long[]tree;
	static int n;
	static int[] src;
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		n=sc.nextInt();
		src=new int[n];
		for(int i=0;i<n;i++) {
			src[i]=sc.nextInt();
		}
		agge(src);
		long[] leftMax=new long[n];
		long[] leftMin=new long[n];
		tree=new long[n+1];
		for(int i=0;i<n;i++) {
			//这里不需要+1，树状数组范围查询需要给左端点-1，这里刚好抵消了
			leftMax[i]=query(n)-query(src[i]);
			leftMin[i]=query(src[i]-1);
			add(src[i],1);
		}
		tree=new long[n+1];
		long[] rightMax=new long[n];
		long[] rightMin=new long[n];
		for(int i=n-1;i>=0;i--){
			rightMax[i]=query(n)-query(src[i]);
			rightMin[i]=query(src[i]-1);
			add(src[i],1);
		}
		long a=0,b=0;
		for(int i=0;i<n;i++) {
			a+=leftMax[i]*rightMax[i];
			b+=leftMin[i]*rightMin[i];
		}
		System.out.println(a+" "+b);
	}
	private static long query(int x) {
		int ans=0;
		for(int i=x;i>0;i-=i&-i) {
			ans+=tree[i];
		}
		return ans;
	}
	
	public static void add(int x,int v) {
		for(int i=x;i<=n;i+=i&-i) {
			tree[i]+=v;
		}
	}
	public static void agge(int[] src) {
		int[] sort=src.clone();
		Arrays.sort(sort);
		for(int i=0;i<src.length;i++) {
			src[i]=Arrays.binarySearch(sort, src[i])+1;
		}
	}
}
